package Presentation;

import Metier.Controleurs.GestionParamHDP;
import Metier.Controleurs.GestionParamProduit;
import Metier.Exceptions.FormulaireIncompletException;
import Metier.Objets.HeurePointe;
import Metier.Objets.Produit;
import Metier.Objets.TypeProduit;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.AbstractTableModel;

public final class OngletConfig extends Onglet {

    /**
     * Attributs
     */
    
    private final GestionParamProduit gConfig;
    private final GestionParamHDP gHDP;
    private JTable tblGeneral;
    private JScrollPane scrollTblGeneral;
    private JPanel panelBoutonsAction;
    private JButton btnAjouterProduit;
    private JButton btnModifierHdp;
    private final ResourceBundle configBundle;
    private List<String> heures;
    private List<String> minutes;
    private List<String> secondes;
    
    //Composants du pop-up des heures de pointe
    private JPanel panelParamHDP;
    private JPanel panelRafraichirHDP;
    private JPanel panelAjoutHDP;
    private JTable tblHDP;
    private JScrollPane scrollTblHDP;
    private JButton bRafraichirHDP;
    private JButton bAjouterHDP;
    private JComboBox comboHeureDebut;
    private JComboBox comboHeureFin;
    private JComboBox comboMinuteDebut;
    private JComboBox comboMinuteFin;
    private JLabel labelHDPdebut;
    private JLabel labelHDPfin;
        
    //Composants du pop-up d'ajout d'un produit
    private JPanel panelAjoutTempsCuisson;
    private JPanel panelAjoutFormulaire;
    private JLabel labelAjoutTypeProduit;
    private JLabel labelAjoutLibelleProduit;
    private JLabel labelAjoutTempsCuisson;
    private JLabel labelAjoutTempsPeremption;
    private JLabel labelAjoutSeuilAlerteVitrine;
    private JLabel labelAjoutSeuilAlerteHdp;
    private JLabel labelAjoutSeuilAlerteFournisseur;
    private JLabel labelAjoutPrixProduit;
    private JTextField fieldAjoutLibelleProduit;
    private JTextField fieldAjoutSeuilAlerteVitrine;
    private JTextField fieldAjoutSeuilAlerteHdp;
    private JTextField fieldAjoutSeuilAlerteFournisseur;
    private JTextField fieldAjoutPrixProduit;
    private JComboBox comboTypeProduit;
    private JComboBox comboAjoutHeures;
    private JComboBox comboAjoutMinutes;
    private JComboBox comboAjoutSecondes;
    private JComboBox comboAjoutPeremption;
    
    
    //Composants du pop-up de modification d'un produit
    private JPanel panelModifTempsCuisson;
    private JPanel panelModifFormulaire;
    private JLabel labelModifLibelleProduit;
    private JLabel labelModifTempsCuisson;
    private JLabel labelModifTempsPeremption;
    private JLabel labelModifSeuilAlerteVitrine;
    private JLabel labelModifSeuilAlerteHdp;
    private JLabel labelModifSeuilAlerteFournisseur;
    private JLabel labelModifPrixProduit;
    private JTextField fieldModifLibelleProduit;
    private JTextField fieldModifSeuilAlerteVitrine;
    private JTextField fieldModifSeuilAlerteHdp;
    private JTextField fieldModifSeuilAlerteFournisseur;
    private JTextField fieldModifPrixProduit;
    private JComboBox comboModifHeures;
    private JComboBox comboModifMinutes;
    private JComboBox comboModifSecondes;
    private JComboBox comboModifPeremption;

    /**
     * Constructeur avec pour paramètre la fenêtre principale
     * @param fp fenêtre principale
     */
    public OngletConfig(FenetrePrincipale fp) {
        super(fp);
        this.gConfig = new GestionParamProduit(this);
        this.gHDP = new GestionParamHDP(this);
        this.configBundle = ResourceBundle.getBundle("ressources/Config/Config", fp.getLocale());
        initComponents();
    }

    /**
     *
     */
    public void initComponents() {

        try{
            //Initialisation des secondes / minutes / heures
            this.heures = new ArrayList<>();
            this.minutes = new ArrayList<>();
            this.secondes = new ArrayList<>();
            
            for(int i=0; i<24; i++){
                this.heures.add(i + "h");
            }
            for(int i=0; i<60; i++){
                this.minutes.add(i + "min");
                this.secondes.add(i + "s");
            }
            
            /**
             * JTable : Produits et leurs paramètres
             */

            this.tblGeneral = new JTable(this.gConfig.getContenuTableauGeneral()){
                @Override
                public boolean isCellEditable(int row, int column){
                    return column == 7 || column == 8;
                }
            };
            this.tblGeneral.setRowHeight(20);
            this.tblGeneral.removeColumn(this.tblGeneral.getColumnModel().getColumn(9));
            this.scrollTblGeneral = new JScrollPane(this.tblGeneral);
            this.add(this.scrollTblGeneral, BorderLayout.CENTER);

            //Action lors du clic que le bouton "Editer" d'une ligne de produit
            Action editProduit = new AbstractAction(){
                @Override
                public void actionPerformed(ActionEvent e){
                    //Récupération du produit édité
                    int row = ((JTable)e.getSource()).getSelectedRow();
                    Produit produitEdit = gConfig.getProduit(Integer.valueOf(tblGeneral.getModel().getValueAt(row, 9).toString()));

                    //Affichage du popup d'édition
                    afficherPopupEditProduit(produitEdit);
                }
            };

            // Action lors du clic que le bouton "Supprimer" d'une ligne de produit
            Action supprProduit = new AbstractAction(){
                @Override
                public void actionPerformed(ActionEvent e){
                    //Récupération du produit à supprimer
                    int row = ((JTable)e.getSource()).getSelectedRow();
                    Produit produitSuppr = gConfig.getProduit(Integer.valueOf(tblGeneral.getModel().getValueAt(row, 9).toString()));
                    
                    //Affichage d'un popup de confirmation de la suppression
                    afficherPopupSupprProduit(produitSuppr);
                }
            };

            //Ajout de la colonne des boutons "Editer" produit
            ButtonColumn buttonColumnEditProd = new ButtonColumn(tblGeneral, editProduit, 7);
            buttonColumnEditProd.setMnemonic(KeyEvent.VK_D);

            //Ajout de la colonne des boutons "Supprimer" produit
            ButtonColumn buttonColumnSupprProd = new ButtonColumn(tblGeneral, supprProduit, 8);
            buttonColumnSupprProd.setMnemonic(KeyEvent.VK_D);

            /**
             * Pop-up de paramétrage des heures de pointes
             */
            
            //Initialisation des composants
            this.panelParamHDP = new JPanel(new BorderLayout());

            //JTable des HDP
            this.tblHDP = new JTable(this.gHDP.getContenuTableauHDP()){
                @Override
                public boolean isCellEditable(int row, int column){
                    return column == 2;
                }
            };
            
            this.tblHDP.setRowHeight(20);
            this.tblHDP.removeColumn(this.tblHDP.getColumnModel().getColumn(3));
            this.scrollTblHDP = new JScrollPane(this.tblHDP);
            
            // Action lors du clic que le bouton "Supprimer" d'une ligne de HDP
            Action supprHDP = new AbstractAction(){
                @Override
                public void actionPerformed(ActionEvent e){
                    //Pop-up de confirmation
                    int choice = JOptionPane.showConfirmDialog(getFP(), configBundle.getString("config.confirmersuppressionhdp"), configBundle.getString("config.supprimerhdp"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
                    if(choice == JOptionPane.OK_OPTION) {
                        //Récupération de l'HDP à supprimer
                        int row = ((JTable)e.getSource()).getSelectedRow();
                        gHDP.supprimerHDP(Integer.valueOf(tblHDP.getModel().getValueAt(row, 3).toString()));
                        rafraichirHDP();
                    } 
                }
            };
            
            //Ajout de la colonne des boutons "Supprimer" produit
            ButtonColumn buttonColumnSupprHDP = new ButtonColumn(tblHDP, supprHDP, 2);
            buttonColumnSupprHDP.setMnemonic(KeyEvent.VK_D);
            
            //Bouton rafraichir des HDP
            this.panelRafraichirHDP = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            this.bRafraichirHDP = new JButton(new ImageIcon(getClass().getResource("/ressources/images/refresh.png")));
            this.bRafraichirHDP.setBackground(Color.decode("#4caf50"));
            this.bRafraichirHDP.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    rafraichirHDP();
                }
            });
            this.panelRafraichirHDP.add(this.bRafraichirHDP);
            
            //Panel d'ajout des HDP
            this.panelAjoutHDP = new JPanel(new GridLayout(3, 3));
            this.labelHDPdebut = new JLabel(this.configBundle.getString("config.formheurededebut"));
            this.labelHDPfin = new JLabel(this.configBundle.getString("config.formheuredefin"));
            this.comboHeureDebut = new JComboBox(this.heures.toArray());
            this.comboMinuteDebut = new JComboBox(this.minutes.toArray());
            this.comboHeureFin = new JComboBox(this.heures.toArray());
            this.comboMinuteFin = new JComboBox(this.minutes.toArray());
            this.bAjouterHDP = new JButton(this.configBundle.getString("config.ajouterhdp"));
            this.bAjouterHDP.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    //Récupération des heures
                    Integer heureDebut, heureFin, minuteDebut, minuteFin;
                    HeurePointe hdp;

                    heureDebut = Integer.parseInt(comboHeureDebut.getSelectedItem().toString().substring(0, comboHeureDebut.getSelectedItem().toString().length()-1));
                    minuteDebut = Integer.parseInt(comboMinuteDebut.getSelectedItem().toString().substring(0, comboMinuteDebut.getSelectedItem().toString().length()-3));
                    heureFin = Integer.parseInt(comboHeureFin.getSelectedItem().toString().substring(0, comboHeureFin.getSelectedItem().toString().length()-1));
                    minuteFin = Integer.parseInt(comboMinuteFin.getSelectedItem().toString().substring(0, comboMinuteFin.getSelectedItem().toString().length()-3));
                    
                    hdp = new HeurePointe(heureDebut, minuteDebut, heureFin, minuteFin);
                    
                    //Vérification validité des heures de pointes
                    if(hdp.isValide()){
                        gHDP.ajouterHDP(heureDebut, minuteDebut, heureFin, minuteFin);
                        rafraichirHDP();
                    }
                    else{
                        JOptionPane.showMessageDialog(null, configBundle.getString("config.hdpinvalide"), configBundle.getString("config.erreur"), JOptionPane.ERROR_MESSAGE);
                    }
                }
            });
            
            this.panelAjoutHDP.add(this.labelHDPdebut);
            this.panelAjoutHDP.add(this.comboHeureDebut);
            this.panelAjoutHDP.add(this.comboMinuteDebut);
            this.panelAjoutHDP.add(this.labelHDPfin);
            this.panelAjoutHDP.add(this.comboHeureFin);
            this.panelAjoutHDP.add(this.comboMinuteFin);
            this.panelAjoutHDP.add(this.bAjouterHDP);
  
            //Ajouts au panel de paramétrage des HDP
            this.panelParamHDP.add(this.panelRafraichirHDP, BorderLayout.PAGE_START); 
            this.panelParamHDP.add(this.scrollTblHDP, BorderLayout.CENTER);
            this.panelParamHDP.add(this.panelAjoutHDP, BorderLayout.SOUTH);
            
            /**
             * Barre de bouton d'actions de paramétrage : Ajouter un produit et Modifier les heures de pointe 
             */

            this.panelBoutonsAction = new JPanel(new FlowLayout(FlowLayout.LEFT));
            this.btnAjouterProduit = new JButton(this.configBundle.getString("config.ajouterproduit"));
            this.btnAjouterProduit.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    afficherPopupAjoutProduit(); 
                }
            });

            this.btnModifierHdp = new JButton(this.configBundle.getString("config.modifierhdp"));
            this.btnModifierHdp.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    //Affiche la pop-up de paramétrage des heures de pointe
                    afficherPopupHDP();
                }
            });

            panelBoutonsAction.add(this.btnAjouterProduit);
            panelBoutonsAction.add(this.btnModifierHdp);
            this.add(this.panelBoutonsAction, BorderLayout.PAGE_END); 

            
            /**
             * Pop-up d'ajout d'un produit
             */

            //Initialisation des composants
            this.panelAjoutFormulaire = new JPanel(new GridLayout(8, 2));
            this.panelAjoutTempsCuisson = new JPanel();
            this.labelAjoutTypeProduit = new JLabel(this.configBundle.getString("config.typeproduit"));
            this.labelAjoutLibelleProduit = new JLabel(this.configBundle.getString("config.libelle"));
            this.labelAjoutTempsCuisson = new JLabel(this.configBundle.getString("config.formtempscuisson"));
            this.labelAjoutTempsPeremption = new JLabel(this.configBundle.getString("config.formtempsperemption"));
            this.labelAjoutSeuilAlerteVitrine = new JLabel(this.configBundle.getString("config.formseuilalertevitrine"));
            this.labelAjoutSeuilAlerteHdp = new JLabel(this.configBundle.getString("config.formseuilalertehdp"));
            this.labelAjoutSeuilAlerteFournisseur = new JLabel(this.configBundle.getString("config.formseuilcommandefournisseur"));
            this.labelAjoutPrixProduit = new JLabel(this.configBundle.getString("config.formprixunitaire"));
            this.fieldAjoutLibelleProduit = new JTextField();
            this.fieldAjoutSeuilAlerteVitrine = new JTextField();
            this.fieldAjoutSeuilAlerteHdp = new JTextField();
            this.fieldAjoutSeuilAlerteFournisseur = new JTextField();
            this.fieldAjoutPrixProduit = new JTextField();
            String[] typesProduit = {this.configBundle.getString("config.viennoiserie"), this.configBundle.getString("config.boisson")};   
            this.comboTypeProduit = new JComboBox(typesProduit);
            this.comboAjoutHeures = new JComboBox(this.heures.toArray());
            this.comboAjoutMinutes = new JComboBox(this.minutes.toArray());
            this.comboAjoutSecondes = new JComboBox(this.secondes.toArray());
            this.comboAjoutPeremption = new JComboBox(this.heures.toArray());

            //Attachement des composants
            this.panelAjoutTempsCuisson.add(this.comboAjoutHeures);
            this.panelAjoutTempsCuisson.add(this.comboAjoutMinutes);
            this.panelAjoutTempsCuisson.add(this.comboAjoutSecondes);
            this.panelAjoutFormulaire.add(this.labelAjoutTypeProduit);
            this.panelAjoutFormulaire.add(this.comboTypeProduit);
            this.panelAjoutFormulaire.add(this.labelAjoutLibelleProduit);
            this.panelAjoutFormulaire.add(this.fieldAjoutLibelleProduit);
            this.panelAjoutFormulaire.add(this.labelAjoutTempsCuisson);
            this.panelAjoutFormulaire.add(this.panelAjoutTempsCuisson);
            this.panelAjoutFormulaire.add(this.labelAjoutTempsPeremption);
            this.panelAjoutFormulaire.add(this.comboAjoutPeremption);
            this.panelAjoutFormulaire.add(this.labelAjoutSeuilAlerteVitrine);
            this.panelAjoutFormulaire.add(this.fieldAjoutSeuilAlerteVitrine);
            this.panelAjoutFormulaire.add(this.labelAjoutSeuilAlerteHdp);
            this.panelAjoutFormulaire.add(this.fieldAjoutSeuilAlerteHdp);
            this.panelAjoutFormulaire.add(this.labelAjoutSeuilAlerteFournisseur);
            this.panelAjoutFormulaire.add(this.fieldAjoutSeuilAlerteFournisseur);
            this.panelAjoutFormulaire.add(this.labelAjoutPrixProduit);
            this.panelAjoutFormulaire.add(this.fieldAjoutPrixProduit);

            //Gestion des évenements
            //Dynamique du formulaire dès que le type de produit est changé
            comboTypeProduit.addActionListener (new ActionListener () {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(comboTypeProduit.getSelectedItem().equals(configBundle.getString("config.boisson"))){
                        comboAjoutPeremption.setEnabled(false);
                        comboAjoutHeures.setEnabled(false);
                        comboAjoutMinutes.setEnabled(false);
                        comboAjoutSecondes.setEnabled(false);
                    }
                    else{
                        comboAjoutPeremption.setEnabled(true);
                        comboAjoutHeures.setEnabled(true);
                        comboAjoutMinutes.setEnabled(true);
                        comboAjoutSecondes.setEnabled(true);
                    }     
                }
            });

            /**
             * Pop-up de modification d'un produit
             */

            //Initialisation des composants
            this.panelModifFormulaire = new JPanel(new GridLayout(7, 2));
             this.panelModifTempsCuisson = new JPanel();
            this.labelModifLibelleProduit = new JLabel(this.configBundle.getString("config.libelle"));
            this.labelModifTempsCuisson = new JLabel(this.configBundle.getString("config.formtempscuisson"));
            this.labelModifTempsPeremption = new JLabel(this.configBundle.getString("config.formtempsperemption"));
            this.labelModifSeuilAlerteVitrine = new JLabel(this.configBundle.getString("config.formseuilalertevitrine"));
            this.labelModifSeuilAlerteHdp = new JLabel(this.configBundle.getString("config.formseuilalertehdp"));
            this.labelModifSeuilAlerteFournisseur = new JLabel(this.configBundle.getString("config.formseuilcommandefournisseur"));
            this.labelModifPrixProduit = new JLabel(this.configBundle.getString("config.formprixunitaire"));
            this.fieldModifLibelleProduit = new JTextField();
            this.fieldModifSeuilAlerteVitrine = new JTextField();
            this.fieldModifSeuilAlerteHdp = new JTextField();
            this.fieldModifSeuilAlerteFournisseur = new JTextField();
            this.fieldModifPrixProduit = new JTextField();
            this.comboModifHeures = new JComboBox(this.heures.toArray());
            this.comboModifMinutes = new JComboBox(this.minutes.toArray());
            this.comboModifSecondes = new JComboBox(this.secondes.toArray());
            this.comboModifPeremption = new JComboBox(this.heures.toArray());
            

            //Attachement des composants
            this.panelModifTempsCuisson.add(this.comboModifHeures);
            this.panelModifTempsCuisson.add(this.comboModifMinutes);
            this.panelModifTempsCuisson.add(this.comboModifSecondes);
            this.panelModifFormulaire.add(this.labelModifLibelleProduit);
            this.panelModifFormulaire.add(this.fieldModifLibelleProduit);
            this.panelModifFormulaire.add(this.labelModifTempsCuisson);
            this.panelModifFormulaire.add(this.panelModifTempsCuisson);
            this.panelModifFormulaire.add(this.labelModifTempsPeremption);
            this.panelModifFormulaire.add(this.comboModifPeremption);
            this.panelModifFormulaire.add(this.labelModifSeuilAlerteVitrine);
            this.panelModifFormulaire.add(this.fieldModifSeuilAlerteVitrine);
            this.panelModifFormulaire.add(this.labelModifSeuilAlerteHdp);
            this.panelModifFormulaire.add(this.fieldModifSeuilAlerteHdp);
            this.panelModifFormulaire.add(this.labelModifSeuilAlerteFournisseur);
            this.panelModifFormulaire.add(this.fieldModifSeuilAlerteFournisseur);
            this.panelModifFormulaire.add(this.labelModifPrixProduit);
            this.panelModifFormulaire.add(this.fieldModifPrixProduit);
        }
        catch(Exception e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(this.configBundle.getString("config.erreurinterne") + " : " + e.getMessage());
        }
    }
    
    /**
     * Affiche la popup d'ajout/suppression  d'heures de pointes
     */
    private void afficherPopupHDP(){
        JOptionPane.showConfirmDialog(getFP(), this.panelParamHDP, this.configBundle.getString("config.parametragehdp"), JOptionPane.CLOSED_OPTION, JOptionPane.PLAIN_MESSAGE);
    }
    
    /**
     * Affiche une popup d'édition des paramètres d'un produit en préchargeant ses données à partir d'un obket Produit
     */
    private void afficherPopupEditProduit(Produit produitEdit){

        try{
            TypeProduit typeProduit;
            Integer heuresCuisson;
            Integer minutesCuisson;
            Integer secondesCuisson;
            Integer tempsCuissonSecondes;
                    
            
            //Préremplissage des JTextField
            if((typeProduit = produitEdit.getType()) == TypeProduit.VIENNOISERIE){
                
                this.comboModifHeures.setEnabled(true);
                this.comboModifMinutes.setEnabled(true);
                this.comboModifSecondes.setEnabled(true);
                this.comboModifPeremption.setEnabled(true);
                
                //Initialisation des combobox
                tempsCuissonSecondes = produitEdit.getTempsCuisson();
                secondesCuisson = tempsCuissonSecondes % 60;
                minutesCuisson = (tempsCuissonSecondes / 60) % 60;
                heuresCuisson = (tempsCuissonSecondes / (60 * 60));
                
                this.comboModifHeures.setSelectedItem(Integer.toString(heuresCuisson)+"h");
                this.comboModifMinutes.setSelectedItem(Integer.toString(minutesCuisson)+"min");
                this.comboModifSecondes.setSelectedItem(Integer.toString(secondesCuisson)+"s");
                this.comboModifPeremption.setSelectedItem(Integer.toString(produitEdit.getDureeVie())+"h");
                
                this.fieldModifLibelleProduit.setText(produitEdit.getNom());
                this.fieldModifSeuilAlerteVitrine.setText(Integer.toString(produitEdit.getSeuilVitrine()));
                this.fieldModifSeuilAlerteHdp.setText(Integer.toString(produitEdit.getSeuilVitrineHDP()));
                this.fieldModifSeuilAlerteFournisseur.setText(Integer.toString(produitEdit.getSeuilStock()));
                this.fieldModifPrixProduit.setText(Float.toString(produitEdit.getPrix()));
            }
            else{
                this.comboModifHeures.setEnabled(false);
                this.comboModifMinutes.setEnabled(false);
                this.comboModifSecondes.setEnabled(false);
                this.comboModifPeremption.setEnabled(false);

                this.fieldModifLibelleProduit.setText(produitEdit.getNom());
                this.fieldModifSeuilAlerteVitrine.setText(Integer.toString(produitEdit.getSeuilVitrine()));
                this.fieldModifSeuilAlerteHdp.setText(Integer.toString(produitEdit.getSeuilVitrineHDP()));
                this.fieldModifSeuilAlerteFournisseur.setText(Integer.toString(produitEdit.getSeuilStock()));
                this.fieldModifPrixProduit.setText(Float.toString(produitEdit.getPrix()));
            }

            //Affichage du popup
            int choice = JOptionPane.showConfirmDialog(getFP(), this.panelModifFormulaire, this.configBundle.getString("config.editerproduit"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
            if(choice == JOptionPane.OK_OPTION) {
                //Si l'utilisateur à valider la modification du produit, on récupère la valeur des champs et on ajoute le produit
                
                String libelle = this.fieldModifLibelleProduit.getText();
                String prix = this.fieldModifPrixProduit.getText();
                String seuilStock = this.fieldModifSeuilAlerteFournisseur.getText();
                String seuilVitrine = this.fieldModifSeuilAlerteVitrine.getText();
                String seuilVitrineHDP = this.fieldModifSeuilAlerteHdp.getText();
                String tempsCuisson;
                String dureeVie;
                
                //Vérification que tout les champs nécessaires ont été remplis
                if(libelle.equals("") || prix.equals("") || seuilStock.equals("") || seuilVitrine.equals("") || seuilVitrineHDP.equals(""))
                    throw new FormulaireIncompletException();

                //On recupère ou non les champs spécifiques au viennoiseries
                if(typeProduit == TypeProduit.VIENNOISERIE){
                    
                    //Récupération des temps de cuisson et de péremption
                    heuresCuisson = Integer.parseInt(comboModifHeures.getSelectedItem().toString().substring(0, comboModifHeures.getSelectedItem().toString().length()-1));
                    minutesCuisson = Integer.parseInt(comboModifMinutes.getSelectedItem().toString().substring(0, comboModifMinutes.getSelectedItem().toString().length()-3));
                    secondesCuisson = Integer.parseInt(comboModifSecondes.getSelectedItem().toString().substring(0, comboModifSecondes.getSelectedItem().toString().length()-1));
                    
                    tempsCuissonSecondes = (heuresCuisson * 3600) + (minutesCuisson * 60) + secondesCuisson;
                    tempsCuisson = Integer.toString(tempsCuissonSecondes);
                    dureeVie = comboModifPeremption.getSelectedItem().toString().substring(0, comboModifPeremption.getSelectedItem().toString().length()-1);
                    
                    //Vérification que tout les champs supplémentaires pour les viennoiseries ont été remplis
                    if(tempsCuisson.equals("") || dureeVie.equals(""))
                        throw new FormulaireIncompletException();
                    
                    //Ajout d'une viennoiserie à partir du contrôleur
                    gConfig.mettreAJourProduit(produitEdit.getId(), libelle, typeProduit, Float.parseFloat(prix), Integer.parseInt(seuilStock), Integer.parseInt(seuilVitrine), Integer.parseInt(seuilVitrineHDP), Integer.parseInt(tempsCuisson), Integer.parseInt(dureeVie));
                }
                else{
                    //Sinon on utilise la signature de l'ajout d'un produit type boisson
                    gConfig.mettreAJourProduit(produitEdit.getId(), libelle, typeProduit, Float.parseFloat(prix), Integer.parseInt(seuilStock), Integer.parseInt(seuilVitrine), Integer.parseInt(seuilVitrineHDP));
                }
                
                //Rafraîchissement de la JTable
                rafraichir();

                //Affichage d'un message de confirmation
                JOptionPane.showMessageDialog(getFP(), this.configBundle.getString("config.leproduit") + libelle + this.configBundle.getString("config.abienetemisajour"));
            }
            //Nettoyage des champs une fois que les valeurs ont été récupérées
            nettoyerChampsEdit();
        }
        catch(FormulaireIncompletException e){
            FenetrePrincipale.afficherPopupErreur(this.configBundle.getString("config.formulaireIncomplet"));
            afficherPopupEditProduit(produitEdit);
        }
        catch(NumberFormatException e){
            FenetrePrincipale.afficherPopupErreur(this.configBundle.getString("config.formatchampinvalide"));
            afficherPopupEditProduit(produitEdit);
        }
        catch(HeadlessException e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(this.configBundle.getString("config.erreurinterne") + e.getMessage());
        }
    }
    
    /**
     * Supprime le produit spécifié
     * @param produitSuppr produit à supprimer
     */
    private void afficherPopupSupprProduit(Produit produitSuppr){
        try{
            int choice = JOptionPane.showConfirmDialog(getFP(), this.configBundle.getString("config.confirmersuppressionproduit"), this.configBundle.getString("config.supprimerproduit") + produitSuppr.getNom(), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
            if(choice == JOptionPane.OK_OPTION) {
                gConfig.supprimerProduit(produitSuppr);
                JOptionPane.showMessageDialog(getFP(), this.configBundle.getString("config.leproduit") + produitSuppr.getNom() + this.configBundle.getString("config.abienetesupprime"));
                rafraichir();
            } 
        }
        catch(HeadlessException e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(this.configBundle.getString("config.erreurinterne"));
        }
    }
    
    /**
     * Affiche une popup d'ajout d'un produit
     */
    private void afficherPopupAjoutProduit(){

        try{
            //Affichage du popup
            int choice = JOptionPane.showConfirmDialog(getFP(), this.panelAjoutFormulaire, this.configBundle.getString("config.ajouterproduit"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
            if(choice == JOptionPane.OK_OPTION) {
                //Si l'utilisateur à valider l'ajout du produit, on récupère la valeur des champs et on ajoute le produit

                TypeProduit typeProduit;
                //Récupération du type de produit
                if(this.comboTypeProduit.getSelectedItem().equals(this.configBundle.getString("config.boisson"))){
                    typeProduit = TypeProduit.BOISSON;
                }
                else{
                    typeProduit = TypeProduit.VIENNOISERIE;
                }

                
                String libelle = this.fieldAjoutLibelleProduit.getText();
                String prix = this.fieldAjoutPrixProduit.getText();
                String seuilStock = this.fieldAjoutSeuilAlerteFournisseur.getText();
                String seuilVitrine = this.fieldAjoutSeuilAlerteVitrine.getText();
                String seuilVitrineHDP = this.fieldAjoutSeuilAlerteHdp.getText();
                String tempsCuisson;
                String dureeVie;
                
                //Vérification que tout les champs nécessaires ont été remplis
                if(libelle.equals("") || prix.equals("") || seuilStock.equals("") || seuilVitrine.equals("") || seuilVitrineHDP.equals(""))
                    throw new FormulaireIncompletException();

                //On recupère ou non les champs spécifiques au viennoiseries
                if(typeProduit == TypeProduit.VIENNOISERIE){  
                    //Récupération des temps de cuisson et de péremption
                    Integer heuresCuisson = Integer.parseInt(comboAjoutHeures.getSelectedItem().toString().substring(0, comboAjoutHeures.getSelectedItem().toString().length()-1));
                    Integer minutesCuisson = Integer.parseInt(comboAjoutMinutes.getSelectedItem().toString().substring(0, comboAjoutMinutes.getSelectedItem().toString().length()-3));
                    Integer secondesCuisson = Integer.parseInt(comboAjoutSecondes.getSelectedItem().toString().substring(0, comboAjoutSecondes.getSelectedItem().toString().length()-1));
                    
                    tempsCuisson = Integer.toString((heuresCuisson * 3600) + (minutesCuisson * 60) + secondesCuisson);
                    dureeVie = comboAjoutPeremption.getSelectedItem().toString().substring(0, comboAjoutPeremption.getSelectedItem().toString().length()-1);
                    
                    //Vérification que tout les champs supplémentaires pour les viennoiseries ont été remplis
                    if(tempsCuisson.equals("") || dureeVie.equals(""))
                        throw new FormulaireIncompletException();
                    
                    //Ajout d'une viennoiserie à partir du contrôleur
                    gConfig.ajouterProduit(libelle, typeProduit, Float.parseFloat(prix), Integer.parseInt(seuilStock), Integer.parseInt(seuilVitrine), Integer.parseInt(seuilVitrineHDP), Integer.parseInt(tempsCuisson), Integer.parseInt(dureeVie));
                }
                else{
                    //Sinon on utilise la signature de l'ajout d'un produit type boisson
                    gConfig.ajouterProduit(libelle, typeProduit, Float.parseFloat(prix), Integer.parseInt(seuilStock), Integer.parseInt(seuilVitrine), Integer.parseInt(seuilVitrineHDP));
                }
              
                //Rafraîchissement de la JTable
                rafraichir();
                
                //Affichage d'un message de confirmation
                JOptionPane.showMessageDialog(getFP(), this.configBundle.getString("config.leproduit") + libelle + this.configBundle.getString("config.abieneteajoute"));
            }
            
            //Nettoyage des champs une fois que les valeurs ont été récupérées
            nettoyerChampsAjout();
        }
        catch(FormulaireIncompletException e){
            FenetrePrincipale.afficherPopupErreur(e.getMessage());
            afficherPopupAjoutProduit();
        }
        catch(NumberFormatException e){
            FenetrePrincipale.afficherPopupErreur(this.configBundle.getString("config.formatchampinvalide"));
            afficherPopupAjoutProduit();
        }
        catch(HeadlessException e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(this.configBundle.getString("config.erreurinterne"));
        }
    }
    
    /**
     * Nettoie les champs du formulaire d'ajout d'un produit
     */
    public void nettoyerChampsAjout(){
        this.fieldAjoutLibelleProduit.setText("");
        this.comboAjoutHeures.setSelectedIndex(0);
        this.comboAjoutMinutes.setSelectedIndex(0);
        this.comboAjoutSecondes.setSelectedIndex(0);
        this.comboAjoutPeremption.setSelectedIndex(0);
        this.fieldAjoutSeuilAlerteVitrine.setText("");
        this.fieldAjoutSeuilAlerteHdp.setText("");
        this.fieldAjoutSeuilAlerteFournisseur.setText("");
        this.fieldAjoutPrixProduit.setText("");
        this.comboTypeProduit.setSelectedIndex(0);
    }
    
    /**
     * Nettoie les champs du formulaire de modification d'un produit
     */
    public void nettoyerChampsEdit(){
        try{
            this.fieldModifLibelleProduit.setText("");
            this.comboModifHeures.setSelectedIndex(0);
            this.comboModifMinutes.setSelectedIndex(0);
            this.comboModifSecondes.setSelectedIndex(0);
            this.comboModifPeremption.setSelectedIndex(0);
            this.fieldModifSeuilAlerteVitrine.setText("");
            this.fieldModifSeuilAlerteHdp.setText("");
            this.fieldModifSeuilAlerteFournisseur.setText("");
            this.fieldModifPrixProduit.setText("");
        }
        catch(Exception e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(this.configBundle.getString("config.erreurinterne"));
        } 
    }
    
    /**
     * Rafrichit la table des heures de pointes
     */
    private void rafraichirHDP(){
        /**
         * Rafraîchissement de la JTable
         */
        try{
            this.tblHDP.removeAll();
            this.tblHDP.setModel(gHDP.getContenuTableauHDP());
            ((AbstractTableModel) tblHDP.getModel()).fireTableDataChanged();
        
            this.tblHDP.removeColumn(this.tblHDP.getColumnModel().getColumn(3));

            // Action lors du clic que le bouton "Supprimer" d'une ligne de HDP
            Action supprHDP = new AbstractAction(){
                @Override
                public void actionPerformed(ActionEvent e){
                    //Pop-up de confirmation
                    int choice = JOptionPane.showConfirmDialog(getFP(), configBundle.getString("config.confirmersuppressionhdp"), configBundle.getString("config.supprimerhdp"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
                    if(choice == JOptionPane.OK_OPTION) {
                        //Récupération de l'HDP à supprimer
                        int row = ((JTable)e.getSource()).getSelectedRow();
                        gHDP.supprimerHDP(Integer.valueOf(tblHDP.getModel().getValueAt(row, 3).toString()));
                        rafraichirHDP();
                    } 
                }
            };

            //Ajout de la colonne des boutons "Supprimer" HDP
            ButtonColumn buttonColumnSupprHDP = new ButtonColumn(tblHDP, supprHDP, 2);
            buttonColumnSupprHDP.setMnemonic(KeyEvent.VK_D);
        }
        catch(Exception e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(this.configBundle.getString("config.erreurinterne"));
        } 
        
        
    }

    @Override
    public void rafraichir() {
        
        /**
         * Rafraîchissement de la JTable
         */
        try{
            this.tblGeneral.removeAll();
            this.tblGeneral.setModel(gConfig.getContenuTableauGeneral());
            ((AbstractTableModel) tblGeneral.getModel()).fireTableDataChanged();
        
            this.tblGeneral.removeColumn(this.tblGeneral.getColumnModel().getColumn(9));

            //Action lors du clic que le bouton "Editer" d'une ligne de produit
            Action editProduit = new AbstractAction(){
                @Override
                public void actionPerformed(ActionEvent e){
                    //Récupération du produit édité
                    int row = ((JTable)e.getSource()).getSelectedRow();
                    Produit produitEdit = gConfig.getProduit(Integer.valueOf(tblGeneral.getModel().getValueAt(row, 9).toString()));

                    //Affichage du popup d'édition
                    afficherPopupEditProduit(produitEdit);
                    rafraichir();
                }
            };

                // Action lors du clic que le bouton "Supprimer" d'une ligne de produit
            Action supprProduit = new AbstractAction(){
                @Override
                public void actionPerformed(ActionEvent e){

                    //Récupération du produit à supprimer
                    int row = ((JTable)e.getSource()).getSelectedRow();
                    Produit produitSuppr = gConfig.getProduit(Integer.valueOf(tblGeneral.getModel().getValueAt(row, 9).toString()));
                    
                    //Affichage d'un popup de confirmation de la suppression
                    afficherPopupSupprProduit(produitSuppr);
                    rafraichir();
                }
            };

            //Ajout de la colonne des boutons "Editer" produit
            ButtonColumn buttonColumnEdit = new ButtonColumn(tblGeneral, editProduit, 7);
            buttonColumnEdit.setMnemonic(KeyEvent.VK_D);

            //Ajout de la colonne des boutons "Supprimer" produit
            ButtonColumn buttonColumnSuppr = new ButtonColumn(tblGeneral, supprProduit, 8);
            buttonColumnSuppr.setMnemonic(KeyEvent.VK_D);
        }
        catch(Exception e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(this.configBundle.getString("config.erreurinterne"));
        } 
        
            
    }

    @Override
    public void help() {
        String msg = configBundle.getString("config.aidemessage");
        JOptionPane.showMessageDialog(this.getFP(),
                msg,
                configBundle.getString("config.aide"),
                JOptionPane.INFORMATION_MESSAGE);
    }
}